package br.com.ac.fatureweb.rest.service;

import java.util.List;

import javax.inject.Inject;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import br.com.ac.fatureweb.exception.AccessNaoAutorizadoException;
import br.com.ac.fatureweb.integration.model.AnaliseAguaVO;
import br.com.ac.fatureweb.integration.model.AvisoDebitoVO;
import br.com.ac.fatureweb.integration.model.ConfiguracaoCalculoVO;
import br.com.ac.fatureweb.integration.model.ConfiguracaoSaaeVO;
import br.com.ac.fatureweb.integration.model.DebitoVO;
import br.com.ac.fatureweb.integration.model.EconomiaVO;
import br.com.ac.fatureweb.integration.model.FaixaVO;
import br.com.ac.fatureweb.integration.model.HistoricoVO;
import br.com.ac.fatureweb.integration.model.ImovelVO;
import br.com.ac.fatureweb.integration.model.LancamentoFuturoVO;
import br.com.ac.fatureweb.integration.model.MensagemVO;
import br.com.ac.fatureweb.integration.model.OcorrenciaVO;
import br.com.ac.fatureweb.integration.model.RoteiroVO;
import br.com.ac.fatureweb.integration.model.SaldoDebitoCreditoVO;
import br.com.ac.fatureweb.integration.model.TarifaSocialVO;
import br.com.ac.fatureweb.integration.model.TarifaVO;
import br.com.ac.fatureweb.service.NgcImportacaoBean;
import br.com.ac.fatureweb.service.NgcLeituristaBean;
import br.com.ac.fatureweb.service.NgcRoteiroBean;
import br.com.ac.fatureweb.service.ValidarAcesso;

@Path("/importBean")
public class ImportBean {

	@Inject
	private NgcLeituristaBean ngcLeituristaBean;

	@Inject
	private NgcImportacaoBean ngcImportacaoBean;

	@Inject
	private NgcRoteiroBean ngcRoteiroBean;

	@POST
	@Path("ping")
	@Produces(MediaType.APPLICATION_JSON)
	public Response ping() {
		try {
			Thread.sleep(5000);

			return Response.ok().entity(true).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findRoteiro")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findRoteiro(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				RoteiroVO roteiroVO = ngcRoteiroBean.findRoteiro(imei);

				if (roteiroVO != null) {
					return Response.ok().entity(roteiroVO).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findAnaliseAgua")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findAnaliseAgua(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<AnaliseAguaVO> lstAnaliseAgua = ngcImportacaoBean
						.findAnaliseAgua(seqRoteiro);

				if (lstAnaliseAgua != null && !lstAnaliseAgua.isEmpty()) {

					return Response.ok().entity(lstAnaliseAgua).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findAvisoDebito")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findAvisoDebito(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<AvisoDebitoVO> lstAvisoDebito = ngcImportacaoBean
						.findAvisoDebito(seqRoteiro);

				if (lstAvisoDebito != null && !lstAvisoDebito.isEmpty()) {

					return Response.ok().entity(lstAvisoDebito).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findConfiguracaoCalculo")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findConfiguracaoCalculo(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				ConfiguracaoCalculoVO configuracaoCalculoVO = ngcImportacaoBean
						.findConfiguracaoCalculo(seqRoteiro);

				if (configuracaoCalculoVO != null) {

					return Response.ok().entity(configuracaoCalculoVO).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findConfiguracaoSaae")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findConfiguracaoSaae(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				ConfiguracaoSaaeVO configuracaoSaaeVO = ngcImportacaoBean
						.findConfiguracaoSaae(seqRoteiro);

				if (configuracaoSaaeVO != null) {

					return Response.ok().entity(configuracaoSaaeVO).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findDebito")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findDebito(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<DebitoVO> lstDebito = ngcImportacaoBean
						.findDebito(seqRoteiro);

				if (lstDebito != null && !lstDebito.isEmpty()) {

					return Response.ok().entity(lstDebito).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findEconomia")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findEconomia(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<EconomiaVO> lstEconomia = ngcImportacaoBean
						.findEconomia(seqRoteiro);

				if (lstEconomia != null && !lstEconomia.isEmpty()) {

					return Response.ok().entity(lstEconomia).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findHistorico")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findHistorico(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<HistoricoVO> lstHistorico = ngcImportacaoBean
						.findHistorico(seqRoteiro);

				if (lstHistorico != null && !lstHistorico.isEmpty()) {

					return Response.ok().entity(lstHistorico).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findImovel")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findImovel(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<ImovelVO> lstImovel = ngcImportacaoBean
						.findImovel(seqRoteiro);

				if (lstImovel != null && !lstImovel.isEmpty()) {

					return Response.ok().entity(lstImovel).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findLancamentoFuturo")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findLancamentoFuturo(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<LancamentoFuturoVO> lstLancamento = ngcImportacaoBean
						.findLancamentoFuturo(seqRoteiro);

				if (lstLancamento != null && !lstLancamento.isEmpty()) {

					return Response.ok().entity(lstLancamento).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findMensagem")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findMensagem(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<MensagemVO> lstMensagem = ngcImportacaoBean
						.findMensagem(seqRoteiro);

				if (lstMensagem != null && !lstMensagem.isEmpty()) {

					return Response.ok().entity(lstMensagem).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findOcorrencia")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findOcorrencia(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<OcorrenciaVO> lstOcorrencia = ngcImportacaoBean
						.findOcorrencia(seqRoteiro);

				if (lstOcorrencia != null && !lstOcorrencia.isEmpty()) {

					return Response.ok().entity(lstOcorrencia).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findSaldoDebitoCredito")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findSaldoDebitoCredito(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<SaldoDebitoCreditoVO> lstSaldoDebCred = ngcImportacaoBean
						.findSaldoDebitoCredito(seqRoteiro);

				if (lstSaldoDebCred != null && !lstSaldoDebCred.isEmpty()) {

					return Response.ok().entity(lstSaldoDebCred).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findTarifaSocial")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findTarifaSocial(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<TarifaSocialVO> lstTarifaSocial = ngcImportacaoBean
						.findTarifaSocial(seqRoteiro);

				if (lstTarifaSocial != null && !lstTarifaSocial.isEmpty()) {

					return Response.ok().entity(lstTarifaSocial).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findTarifa")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findTarifa(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<TarifaVO> lstTarifa = ngcImportacaoBean
						.findTarifa(seqRoteiro);

				if (lstTarifa != null && !lstTarifa.isEmpty()) {

					return Response.ok().entity(lstTarifa).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

	@POST
	@Path("findFaixa")
	@Produces(MediaType.APPLICATION_JSON)
	public Response findFaixa(

	@FormParam("imei") final String imei,

	@FormParam("usuario") final Long usuario,

	@FormParam("senha") final String senha,

	@FormParam("seqRoteiro") final Long seqRoteiro) {
		try {
			if (ValidarAcesso.execute(usuario, senha, imei, ngcLeituristaBean)) {

				List<FaixaVO> lstFaixaVO = ngcImportacaoBean
						.findFaixa(seqRoteiro);

				if (lstFaixaVO != null && !lstFaixaVO.isEmpty()) {

					return Response.ok().entity(lstFaixaVO).build();
				}
			}

			return Response.status(Status.NO_CONTENT).build();
		} catch (AccessNaoAutorizadoException anae) {
			return Response.status(Status.UNAUTHORIZED)
					.entity(anae.getMessage()).build();
		} catch (final Exception e) {
			return Response.status(Status.INTERNAL_SERVER_ERROR)
					.entity(e.getMessage()).build();
		}
	}

}
